package com.ktjy.controller;

import com.alibaba.fastjson2.JSON;
import com.ktjy.pojo.LogDTO;
import com.ktjy.utils.RabbitMQUtil;
import com.rabbitmq.client.BuiltinExchangeType;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;

public class RoutingProducer {
    public static void main(String[] args) {
        try (Connection connection = RabbitMQUtil.newConnection();
             Channel channel = connection.createChannel()) {
            String queueFileLog = "file_log_queue"; // 文件日志队列
            String queueDataBaseLog = "db_log_queue"; // 数据库日志队列
            String exchangeName = "exchange_routing1"; // 交换机名称
            // 定义交换机
            channel.exchangeDeclare(exchangeName,
                    BuiltinExchangeType.DIRECT, // 路由模式交换机使用DIRECT类型
                     true, false, false, null);
            // 定义队列
            channel.queueDeclare(queueFileLog, true, false, false, null);
            channel.queueDeclare(queueDataBaseLog, true, false, false, null);
            // 绑定交换机和队列的关系，用路由键区分不同日志级别，三种都需要文件记录
            channel.queueBind(queueFileLog, exchangeName, "INFO");
            channel.queueBind(queueFileLog, exchangeName, "WARNING");
            channel.queueBind(queueFileLog, exchangeName, "ERROR");
            // 数据库只需要接受 ERROR（ 这里是 BindingKey）
            channel.queueBind(queueDataBaseLog, exchangeName, "ERROR");
            // 定义 3 条日志记录
            List<LogDTO> logs = Arrays.asList(
                    new LogDTO("INFO", LocalDateTime.now(), "用户登录成功！"),
                    new LogDTO("WARNING", LocalDateTime.now(), "备份文件失败！"),
                    new LogDTO("ERROR", LocalDateTime.now(), "系统内存溢出！"));
            // 发送所有日志消息
            for (LogDTO log : logs) {
                channel.basicPublish(exchangeName,
                        log.getLevel(), // ： 注意： 使用日志级别作为路由键 （RoutingKey） ）
                        null, JSON.toJSONBytes(log));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
